﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using Excel = Microsoft.Office.Interop.Excel;

namespace Aplicaciones
{
    public partial class wndAlgoritmo : Form
    {
        private String strNombre="";
        private List<Elemento> LO;

        public wndAlgoritmo()
        {
            InitializeComponent();
        }

        private void label1_Click(object sender, EventArgs e)
        {

        }

        private void label1_Click_1(object sender, EventArgs e)
        {

        }

        private void txtProfundidad_TextChanged(object sender, EventArgs e)
        {

        }

        private void txtLongitud_TextChanged(object sender, EventArgs e)
        {

        }

        private void txtAltura_TextChanged(object sender, EventArgs e)
        {

        }

        private void btnAlgoritmear_Click(object sender, EventArgs e)
        {
            int alturaContenedor;
            int longitudContenedor;
            int profundidadContenedor;
            

            //String aviso = "";

            try {
                if (!Int32.TryParse(txtAltura.Text.ToString(), out alturaContenedor))
                {
                    MessageBox.Show("La altura del contenedor debe ser un número","Aviso!",MessageBoxButtons.OK);
                    return;
                }

                if (!Int32.TryParse(txtLongitud.Text.ToString(), out longitudContenedor))
                {
                    MessageBox.Show("La longitud del contenedor debe ser un número","Aviso!",MessageBoxButtons.OK);
                    return;
                }

                if (!Int32.TryParse(txtProfundidad.Text.ToString(), out profundidadContenedor))
                {
                    MessageBox.Show("La profundidad del contenedor debe ser un número", "Aviso!", MessageBoxButtons.OK);
                    return;
                }

                if (strNombre=="")
                {
                    MessageBox.Show("Debe ingresar un archivo de objetos", "Aviso!", MessageBoxButtons.OK);
                    return;
                }

                if (MessageBox.Show("¿Está seguro de algoritmear los parámetros ingresados?", "Confirmación!", MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.Yes) {

                    LO = leerArchivo(strNombre);

                    int numObjInicial=LO.Count;

                    for (int i = 0; i < LO.Count; i++)
                    {
                        
                        if (LO.ElementAt(i)._alto > alturaContenedor)
                        { 
                            LO.RemoveAt(i);
                            i--;
                        }
                        else if (LO.ElementAt(i)._ancho > longitudContenedor)
                        {
                            LO.RemoveAt(i);
                            i--;
                        }
                        else if (LO.ElementAt(i)._profundidad > profundidadContenedor)
                        {
                            LO.RemoveAt(i);
                            i--;
                        }
                    

                    }

                    if (numObjInicial > LO.Count) {
                        MessageBox.Show("Se encontraron objetos de dimensiones mayores a la del contenedor. Dichos objetos fueron eliminados");
                    }

                    //for (int i = 0; i < LO.Count; i++) {
                    //    aviso += "Elemento " + i + ": Altura: " + LO.ElementAt(i)._alto+"\n";
                    //}
                    //MessageBox.Show(aviso);

                    
                    AlgoritmoBinPacking bp = new AlgoritmoBinPacking();
                    List<Contenedor> ZO=bp.BinPacking(alturaContenedor, longitudContenedor, profundidadContenedor, LO);

                    String[] strSol = new String[ZO.Count+LO.Count+10];

                    int k = 0;
                    for (int i = 0; i < ZO.Count; i++) {
                        //System.Console.WriteLine("Contenedor "+i);
                        strSol[k] = "Contenedor " + i;
                        k++;
                        LO=ZO.ElementAt(i)._elementos;

                        for (int j = 0; j < LO.Count; j++) {
                            //System.Console.WriteLine("Objeto " + j + "-> Altura: " + LO.ElementAt(j)._alto + " Largo: " + LO.ElementAt(j)._ancho + " Profundidad: " + LO.ElementAt(j)._profundidad);
                            strSol[k] = "Objeto " + j + "-> Altura: " + LO.ElementAt(j)._alto + " Largo: " + LO.ElementAt(j)._ancho + " Profundidad: " + LO.ElementAt(j)._profundidad + " X: " + LO.ElementAt(j)._x + " Y: " + LO.ElementAt(j)._y + " z: " + LO.ElementAt(j)._z;
                            k++;
                        }
                    }

                    txtSolucion.Lines = strSol;

                    txtCantCont.Text = ZO.Count.ToString();
                    txtVolCont.Text = (ZO.Count * ZO.ElementAt(0)._volumen).ToString();

                    int volOcu=0;

                    for (int i = 0; i < ZO.Count; i++) {
                        volOcu += ZO.ElementAt(0)._volumen-ZO.ElementAt(i)._desperdicio;
                    }

                    txtVolOcu.Text = volOcu.ToString();

                    txtEficiencia.Text = (((Double)(volOcu))*100 / ((Double)(ZO.Count * ZO.ElementAt(0)._volumen))).ToString()+"%";
                    btnGrafiquear.Enabled = true;
                    txtAltura.Enabled = false;
                    txtLongitud.Enabled = false;
                    txtProfundidad.Enabled = false;
                    btnExaminar.Enabled = false;
                    btnAlgoritmear.Enabled = false;
                }

                

            }
            catch(Exception ex){
                MessageBox.Show("Se ha producido este error: "+ex.Message, "Warning!", MessageBoxButtons.OK);
            }
        }

        private void btnExaminar_Click(object sender, EventArgs e)
        {
           
            
            OpenFileDialog ofdObjetos = new OpenFileDialog();
            ofdObjetos.Title = "Elija el archivo con la lista de objetos";
            ofdObjetos.Filter = "Documento de Excel (*.xls)|*.xls";
            ofdObjetos.InitialDirectory = "C:";

            if (ofdObjetos.ShowDialog() == DialogResult.OK)
            {
                strNombre = ofdObjetos.FileName;
                txtExaminar.Text = strNombre;
                
            }
            else {
                strNombre = "";
            }
        }

        private List<Elemento> leerArchivo(String nomfile) {
            Excel.Application xlsApp;
            Excel.Workbook xlsWB;
            Excel.Worksheet xlsWS;
            Excel.Range xlsRange;

            Double numDoub;
            List<Elemento> LO=new List<Elemento>();
            Elemento e;
            int alto;
            int largo;
            int profundidad;

            xlsApp = new Excel.Application();
            
            
            xlsWB = xlsApp.Workbooks.Open(nomfile, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
            xlsWS = (Excel.Worksheet)xlsWB.Worksheets.get_Item(1);
            xlsRange = xlsWS.UsedRange;

            for (int i = 1; i <= xlsRange.Rows.Count; i++)
            {
                numDoub = (xlsRange.Cells[i, 1] as Excel.Range).Value2;
                alto = Convert.ToInt32(numDoub);

                numDoub = (xlsRange.Cells[i, 2] as Excel.Range).Value2;
                largo = Convert.ToInt32(numDoub);

                numDoub = (xlsRange.Cells[i, 3] as Excel.Range).Value2;
                profundidad = Convert.ToInt32(numDoub);
                
                e = new Elemento(profundidad, largo, alto);
                LO.Add(e);
                
            }

            return LO;

        }

        private void label3_Click(object sender, EventArgs e)
        {

        }

        private void txtGrafiquear_Click(object sender, EventArgs e)
        {
            txtAltura.Enabled = true;
            txtLongitud.Enabled = true;
            txtProfundidad.Enabled = true;
            btnExaminar.Enabled = true;
            btnAlgoritmear.Enabled = true;
            btnGrafiquear.Enabled = false;

            //Application.Run(new ());
        }
    }
}
